C++ 左值与右值
左值与右值
简单定义
- 左值(lvalue, locator value)表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象
- 右值(rvalue)是一个不表示内存中某个可识别位置的对象的表达式(一个表达式不是左值就是右值)
1 | int var = 4l; // 正确 |
常量 4 和表达式 var + 1 都不是左值(也就是说,它们是右值),因为它们都是表达式的临时结果,而没有可识别的内存位置(也就是说,只存在于计算过程中的每个临时寄存器中)。因此,赋值给它们是没有任何语义上的意义的——我们赋值到了一个不存在的位置。
右值引用
- 定义: 右值引用是一种新的引用类型,通过
&&表示。它允许我们绑定到右值(临时对象、将要销毁的对象)。 - 作用: 主要用于实现移动语义和完美转发
1 | int&& rvalue = 42; // rvalue 是右值引用 |
移动语义
- 定义: 移动语义是一种允许将资源(如内存)从一个对象“移动”到另一个对象的语义。它通过右值引用来实现,避免了不必要的拷贝操作。
- 优势: 提高了性能,特别是在处理临时对象、容器元素的插入、返回值优化等场景。
万能引用
1 | template<typename T> |
这里的 print 可以接受左值引用,也能接受右值引用